#pragma once

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>


namespace Test
{

    /// @brief 传入一个value，返回value的16进制字符串
    /// @tparam T
    /// @tparam Size sizeof(T)
    /// @param value 传入值
    /// @return value对应的16进制字符串
    template <typename T, std::size_t Size = sizeof(T)>
    std::string printHex(const T &value)
    {
        char bin[Size];
        memcpy(bin, &value, Size);
        std::stringstream ss;
        int endian = 1;
        char c = *(char *)(&endian);
        if (c & 0x01) // 小端序
        { 
            for (int i = Size - 1; i >= 0; --i)
            {
                int num = 0;
                memcpy(&num, &bin[i], sizeof(char));
                ss << std::hex << std::setw(2) << std::setfill('0') << num; // 设置输出的16进制字符为2个字符宽，不足部分用 '0' 填充
                ss << " ";
            }
        }
        else // 大端序
        { 
            for (int i = 0; i < Size; ++i)
            {
                int num = 0;
                memcpy(&num, &bin[i], sizeof(char));
                ss << std::hex << std::setw(2) << std::setfill('0') << num;
                ss << " ";
            }
        }
        return ss.str();
    }
}